RIPEMD-160
RIPEMD-160 один из алгоритмов криптографического хэширования. Имеет длину результирующего дайджеста 160 бит. Разработан Hans Dobbertin, Antoon Bosselaers и Bart Preneel. Из-за проблем, связанных с MD4 и MD5, европейская организация RACE Integrity Primitives Evaluation (RIPE) разработала стандарт RIPEMD-160. Он также был разработан на основе MD4, но генерирует дайджест длиной 160 бит. Однако так же как и SHA-1, этот алгоритм значительно менее эффективен, чем MD5. Существуют версии: RIPEMD-128, RIPEMD-256 и RIPEMD-320. 128-битная версия не отличалась от первоначального RIPEMD, который был также 128-битный.А в 256 и 320-битных версиях только уменьшилась вероятность появления коллизии, и не имеют более высокий уровень безопасности по сравнению с RIPEMD-128 и RIPEMD-160. RIPEMD хеши RIPEMD-128("The quick brown fox jumps over the lazy dog") = 3fa9b57f053c053fbe2735b2380db596 RIPEMD-160("The quick brown fox jumps over the lazy dog") = 37f332f68db77bd9d7edd4969571ad671cf9dd3b RIPEMD-256("The quick brown fox jumps over the lazy dog") = c3b0c2f764ac6d576a6c430fb61a6f2255b4fa833e094b1ba8c1e29b6353036f RIPEMD-320("The quick brown fox jumps over the lazy dog") = e7660e67549435c62141e51c9ab1dcc3b1ee9f65c0b3e561ae8f58c5dba3d21997781cd1cc6fbc34 Любое малейшее изменение в исходном тексте (с очень высокой вероятностью 1-10-154) в результате дает другой хэш. В нашем примере изменим букву d наc: RIPEMD-128("The quick brown fox jumps over the lazy cog") = 3807aaaec58fe336733fa55ed13259d9 RIPEMD-160("The quick brown fox jumps over the lazy cog") = 132072df690933835eb8b6ad0b77e7b6f14acad7 RIPEMD-256("The quick brown fox jumps over the lazy cog") = b44055d843dea5bcd2151e52b1a0dbc5e8e34493e5fe2f000c0e71f73c3ddcae RIPEMD-320("The quick brown fox jumps over the lazy cog") = 393e0df728c4ce3d79e7dcfd357d5c26f5c6d64c6d652dc53b6547b214ea9183e4f61c477ebf5cb0 Добавление символов в строку, конкатенация строк и прочее изменение также влияет на результат. Рассмотрим в качестве примера пустой символ: RIPEMD-128("") = cdf26213a150dc3ecb610f18f6b38b46 RIPEMD-160("") = 9c1185a5c5e9fc54612808977ee8f548b2258d31 RIPEMD-256("") = 02ba4c4e5f8ecd1877fc52d64d30e37a2d9774fb1e5d026380ae0168e3c5522d RIPEMD-320("") = 22d65d5661536cdc75c1fdf5c6de7b41b9f27325ebc61e8557177d705a0ec880151c3a32a00899b8 Реализация Алгоритма #include "rmd160.h" void MDinit(dword *MDbuf) { MDbuf0 = 0x67452301UL; MDbuf1 = 0xefcdab89UL; MDbuf2 = 0x98badcfeUL; MDbuf3 = 0x10325476UL; MDbuf4 = 0xc3d2e1f0UL; return; } void compress(dword *MDbuf, dword *X) { dword aa = MDbuf0, bb = MDbuf1, cc = MDbuf2, dd = MDbuf3, ee = MDbuf4; dword aaa = MDbuf0, bbb = MDbuf1, ccc = MDbuf2, ddd = MDbuf3, eee = MDbuf4; /* round 1 */ FF(aa, bb, cc, dd, ee, X[ 0], 11); FF(ee, aa, bb, cc, dd, X[ 1], 14); FF(dd, ee, aa, bb, cc, X[ 2], 15); FF(cc, dd, ee, aa, bb, X[ 3], 12); FF(bb, cc, dd, ee, aa, X[ 4], 5); FF(aa, bb, cc, dd, ee, X[ 5], 8); FF(ee, aa, bb, cc, dd, X[ 6], 7); FF(dd, ee, aa, bb, cc, X[ 7], 9); FF(cc, dd, ee, aa, bb, X[ 8], 11); FF(bb, cc, dd, ee, aa, X[ 9], 13); FF(aa, bb, cc, dd, ee, X10, 14); FF(ee, aa, bb, cc, dd, X11, 15); FF(dd, ee, aa, bb, cc, X12, 6); FF(cc, dd, ee, aa, bb, X13, 7); FF(bb, cc, dd, ee, aa, X14, 9); FF(aa, bb, cc, dd, ee, X15, 8); (...) /* combine results */ ddd += cc + MDbuf1; /* final result for MDbuf0 */ MDbuf1 = MDbuf2 + dd + eee; MDbuf2 = MDbuf3 + ee + aaa; MDbuf3 = MDbuf4 + aa + bbb; MDbuf4 = MDbuf0 + bb + ccc; MDbuf0 = ddd; return; } void MDfinish(dword *MDbuf, byte *strptr, dword lswlen, dword mswlen) { unsigned int i; /* counter */ dword X16; /* message words */ memset(X, 0, 16*sizeof(dword)); /* put bytes from strptr into X */ for (i=0; i<(lswlen&63); i++) { /* byte i goes into word Xdiv 4 at pos. 8*(i mod 4) */ Xi>>2 ^= (dword) *strptr++ << (8 * (i&3)); } /* append the bit m_n 1 */ X(lswlen>>2)&15 ^= (dword)1 << (8*(lswlen&3) + 7); if ((lswlen & 63) > 55) { /* length goes to next block */ compress(MDbuf, X); memset(X, 0, 16*sizeof(dword)); } /* append length in bits*/ X14 = lswlen << 3; X15 = (lswlen >> 29) | (mswlen << 3); compress(MDbuf, X); return; } См. также: * RIPEMD-256 * RIPEMD-320 Ссылки * http://homes.esat.kuleuven.be/~bosselae/ripemd160.html * http://homes.esat.kuleuven.be/~cosicart/pdf/AB-9601/ (Исходные коды) de:RIPEMD-160 en:RIPEMD es:RIPEMD-160 fr:RIPEMD-160 pl:RIPEMD-160 sr:RIPEMD tr:RIPEMD-160